package com.luxsoft.siipap.em.replica.importadores.cxc.parches;

import java.sql.SQLException;
import java.sql.Types;
import java.util.HashSet;
import java.util.List;
import java.util.Map;
import java.util.Set;

import org.hibernate.HibernateException;
import org.hibernate.Session;
import org.springframework.jdbc.core.SqlParameterValue;
import org.springframework.orm.hibernate3.HibernateCallback;

import com.luxsoft.siipap.cxc.model.AplicacionDeNota;
import com.luxsoft.siipap.cxc.model.AplicacionDePago;
import com.luxsoft.siipap.em.replica.importadores.cxc.ImportadorDeNotas;
import com.luxsoft.siipap.em.replica.importadores.cxc.ImportadorDePagos;
import com.luxsoft.siipap.model.Periodo;
import com.luxsoft.siipap.service.ServiceLocator2;
import com.luxsoft.siipap.util.DBUtils;

public class BuscarAplicacionesDePagosFaltantes {
	
	
	
	public Set<Long> buscarPagosFaltantes(final Periodo p){
		//Ids de Oracle
		String sql="select APLIC_ID,ABONO_ID from V_APLIC_ORACLE where fecha between ? and  ? and tipo_id=\'PAGO\'order by APLIC_ID asc";
		SqlParameterValue p1=new SqlParameterValue(Types.DATE,p.getFechaInicial());
		SqlParameterValue p2=new SqlParameterValue(Types.DATE,p.getFechaFinal());
		final List<Map<String, Number>> ids=ServiceLocator2.getAnalisisJdbcTemplate().queryForList(sql, new Object[]{p1,p2});
		final Set<Long> faltantes=new HashSet<Long>();
		return (Set)ServiceLocator2.getHibernateTemplate().execute(new HibernateCallback(){
			public Object doInHibernate(Session session)throws HibernateException, SQLException {
				int buff=0;
				for(Map<String, Number> id:ids){
					try {
						AplicacionDePago ap=(AplicacionDePago)session.createQuery("from AplicacionDePago a where a.siipapId=?")
						.setLong(0, id.get("APLIC_ID").longValue())
						.setMaxResults(1)
						.uniqueResult();
						if(ap==null){
							System.out.println("No localizo el id: "+id);
							faltantes.add(id.get("ABONO_ID").longValue());
						}
					} catch (Exception e) {
						System.out.println("Error localizando : "+id);
						e.printStackTrace();
					}
					
					if(buff++%20==0){						
						session.clear();
						session.flush();
					}
				}
				
				return faltantes;
			}
			
		});
		//System.out.println("Abonos faltantes: "+errores);		
		
	}
	
	public Set<Long> buscarNotasFaltantes(final Periodo p){
		//Ids de Oracle
		String sql="select APLIC_ID,ABONO_ID from V_APLIC_ORACLE where fecha between ? and  ? and tipo_id=\'NOTA\'order by APLIC_ID asc";
		SqlParameterValue p1=new SqlParameterValue(Types.DATE,p.getFechaInicial());
		SqlParameterValue p2=new SqlParameterValue(Types.DATE,p.getFechaFinal());
		final List<Map<String, Number>> ids=ServiceLocator2.getAnalisisJdbcTemplate().queryForList(sql, new Object[]{p1,p2});
		final Set<Long> aplicacionesFaltantesCargos=new HashSet<Long>();
		return (Set)ServiceLocator2.getHibernateTemplate().execute(new HibernateCallback(){
			public Object doInHibernate(Session session)throws HibernateException, SQLException {
				int buff=0;
				for(Map<String, Number> id:ids){
					AplicacionDeNota ap=(AplicacionDeNota)session.createQuery("from AplicacionDeNota a where a.siipapId=?")
					.setLong(0, id.get("APLIC_ID").longValue())
					.setMaxResults(1)
					.uniqueResult();
					if(ap==null){
						System.out.println("No localizo el id: "+id);
						aplicacionesFaltantesCargos.add(id.get("ABONO_ID").longValue());
					}
					if(buff++%20==0){						
						session.clear();
						session.flush();
					}
				}
				return aplicacionesFaltantesCargos;
			}
			
		});
	}
	
	
	
	public  void ajustarAplicacionesNotasFaltantes(Periodo per){
		Set<Long> res=buscarNotasFaltantes(per);
		for(Long id:res){
			System.out.println("Falta pago: "+id);
			ImportadorDeNotas.getInstance().importar(id);
		}
	}
	
	public void ajustarAplicacionesDePagosFaltantes(Periodo per){
		Set<Long> res=buscarPagosFaltantes(per);
		for(Long id:res){
			System.out.println("Falta pago: "+id);
			ImportadorDePagos.getInstance().importar(id);
		}
	}
	
	public static void main(String[] args) {
		DBUtils.whereWeAre();
		BuscarAplicacionesDePagosFaltantes b=new BuscarAplicacionesDePagosFaltantes();
		Periodo per=new Periodo("01/02/2009","28/02/2009");
		
		b.ajustarAplicacionesDePagosFaltantes(per);
		
		//b.ajustarAplicacionesNotasFaltantes(per);
		
	}

}
